package cn.tedu.v4;

/**
 * 多线程并发安全问题：
 * 当多个线程并发操作同一个资源时候，由于线程切换时机不确定
 * 可能会导致代码瘫痪，而且还有可能出现程序错误，严重软件瘫痪【卡死】
 *
 * 客户端  多线程并发 ×   服务器  多线程并发 √
 *
 * synchronized 关键字 ---多线程并发  同步锁
 *
 * 使用方法①：同步块方法  最常用
 *        ②：同步方法  一个线程执行完毕后，再执行下一个
 * 定义语法  synchronized(同步监视器对象){
 *     需要同步运行的代码块;
 * }
 *
 */
public class Thread_syn {
    public static void main(String[] args) {

        //创建wc类
        WC wc=new WC();
        Thread p1 = new Thread(() -> {
            wc.door();
        });
        Thread p2 = new Thread(() -> {
            wc.door();
        });
        p1.start();
        p2.start();
    }

    //创建wc类
    static class WC {
        public void door() {
            //线程实力--记录线程信息
            Thread s = Thread.currentThread();
            System.out.println(s.getName() + "去wc");
            try {
                //同步锁:门前加一把钥匙
                //多线程执行 同步锁，每次只放行一个线程
                synchronized (this) {
                    Thread.sleep(5000);
                    System.out.println(s.getName() + "找门进去");
                }
                Thread.sleep(3000);
                System.out.println(s.getName()+"走人");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}




















